//package com.gosling.cloudspace.tools;
//
//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
//import TrustAllTrustManager;
//import org.apache.http.HttpEntityEnclosingRequest;
//import org.apache.http.HttpRequest;
//import org.apache.http.NoHttpResponseException;
//import org.apache.http.client.HttpRequestRetryHandler;
//import org.apache.http.client.protocol.HttpClientContext;
//import org.apache.http.config.Registry;
//import org.apache.http.config.RegistryBuilder;
//import org.apache.http.conn.ConnectTimeoutException;
//import org.apache.http.conn.socket.ConnectionSocketFactory;
//import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
//import org.apache.http.conn.socket.PlainConnectionSocketFactory;
//import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClients;
//import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
//import org.apache.http.protocol.HttpContext;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import javax.net.ssl.*;
//import java.io.*;
//import java.net.*;
//import java.nio.charset.Charset;
//import java.nio.charset.StandardCharsets;
//import java.text.MessageFormat;
//import java.util.LinkedHashMap;
//
//public class HttpTool {
//    private static final Logger LOG = LoggerFactory.getLogger(HttpTool.class);
//    //超时时间
//    private static final int MAX_TIMEOUT = 3000;
//    //最大连接数
//    private static final int MAX_TOTAL = 10;
//    //每个路由基础的连接数
//    private static final int ROUTE_MAX_TOTAL = 3;
//    //重试次数
//    private static final int MAX_RETRY = 5;
//    //连接池
//    private static PoolingHttpClientConnectionManager connMgr;
//    //重试机制
//    private static HttpRequestRetryHandler retryHandler;
//
//    static {
//        cfgPoolMgr();
//        cfgRetryHandler();
//    }
//
//    /***
//     * 向指定URL发送GET方法的请求
//     *
//     * @param apiUrl
//     * @param encoding
//     * @return
//     * @throws Exception
//     */
//    public static String sendGet(String apiUrl, LinkedHashMap<String, String> headers,
//                                 String encoding) throws Exception {
//        // 获得响应内容
//        String http_RespContent = null;
//        HttpURLConnection httpURLConnection = null;
//        int http_StatusCode = 0;
//        String http_RespMessage = null;
//        try {
//            LOG.info(">>>> 实际请求Url: " + apiUrl);
//            // 建立连接
//            URL url = new URL(apiUrl);
//            URLConnection urlConnection = url.openConnection();
//            httpURLConnection = (HttpURLConnection) urlConnection;
//            // 需要输出
//            httpURLConnection.setDoOutput(true);
//            // 需要输入
//            httpURLConnection.setDoInput(true);
//            // 不允许缓存
//            httpURLConnection.setUseCaches(false);
//            // HTTP请求方式
//            httpURLConnection.setRequestMethod("GET");
//            // 设置Headers
//            if (null != headers) {
//                for (String key : headers.keySet()) {
//                    httpURLConnection.setRequestProperty(key, headers.get(key));
//                }
//            }
//            // 连接会话
//            httpURLConnection.connect();
//            // 获得响应状态(HTTP状态码)
//            http_StatusCode = httpURLConnection.getResponseCode();
//            // 获得响应消息(HTTP状态码描述)
//            http_RespMessage = httpURLConnection.getResponseMessage();
//            // 获得响应内容
//            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
//                // 返回响应结果
//                http_RespContent = getResponseContent(httpURLConnection);
//            } else {
//                // 返回非200状态时响应结果
//                http_RespContent = getErrorResponseContent(httpURLConnection);
//                String msg = MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
//                LOG.info(msg);
//            }
//        } catch (UnknownHostException e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (MalformedURLException e) {
//            String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (IOException e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (Exception e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } finally {
//            if (null != httpURLConnection) {
//                httpURLConnection.disconnect();
//            }
//        }
//        return http_RespContent;
//    }
//
//    /***
//     * 排除SSL证书
//     *
//     * @param toURL
//     * @return
//     * @throws Exception
//     */
//    public static String noSSLSendGet(String toURL) throws Exception {
//        LOG.info(">>>> 实际请求Url: " + toURL);
//        StringBuffer bs = new StringBuffer();
//        try {
//            TrustManager[] trustAllCerts = {new TrustAllTrustManager()};
//            SSLContext sc = SSLContext.getInstance("SSL");
//            sc.getServerSessionContext().setSessionTimeout(0);
//            sc.init(null, trustAllCerts, null);
//            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
//            HttpsURLConnection.setDefaultHostnameVerifier((arg0, arg1) -> true);
//            URL url = new URL(toURL);
//            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//            connection.setConnectTimeout(30000);
//            connection.setReadTimeout(30000);
//            connection.setDoOutput(true);
//            connection.setDoInput(true);
//            connection.connect();
//            InputStream is = connection.getResponseCode() == 200 ? connection.getInputStream() : connection.getErrorStream();
//            BufferedReader buffer = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
//            String l = null;
//            while ((l = buffer.readLine()) != null) {
//                bs.append(l);
//            }
//            String result = bs.toString();
//            LOG.info("HTTPS请求返回结果:{}", result);
//            return result;
//        } catch (Exception e) {
//            e.printStackTrace();
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        }
//    }
//
//    /***
//     * PUT请求
//     *
//     * @param urlPath
//     * @param data
//     * @param charSet
//     * @param headers
//     * @return
//     */
//    public static String doPut(String urlPath, String data, String charSet, LinkedHashMap<String, String> headers) {
//        LOG.info("请求参数:{}", data);
//        String result = null;
//        HttpURLConnection httpurlconnection = null;
//        try {
//            URL url = new URL(urlPath);
//            httpurlconnection = (HttpURLConnection) url.openConnection();
//            httpurlconnection.setDoInput(true);
//            httpurlconnection.setDoOutput(true);
//            httpurlconnection.setConnectTimeout(2000000);
//            httpurlconnection.setReadTimeout(2000000);
//            if (null != headers) {
//                for (String key : headers.keySet()) {
//                    httpurlconnection.setRequestProperty(key, headers.get(key));
//                }
//            }
//            httpurlconnection.setRequestMethod("PUT");
//            if (StringUtils.isNotBlank(data)) {
//                httpurlconnection.getOutputStream().write(data.getBytes(charSet));
//            }
//            httpurlconnection.getOutputStream().flush();
//            httpurlconnection.getOutputStream().close();
//            int code = httpurlconnection.getResponseCode();
//            if (code == 200) {
//                DataInputStream in = new DataInputStream(httpurlconnection.getInputStream());
//                int len = in.available();
//                byte[] by = new byte[len];
//                in.readFully(by);
//                if (StringUtils.isNotBlank(charSet)) {
//                    result = new String(by, Charset.forName(charSet));
//                } else {
//                    result = new String(by);
//                }
//                in.close();
//            } else {
//                LOG.error("请求地址：" + urlPath + "返回状态异常，异常号为：" + code);
//            }
//        } catch (Exception e) {
//            LOG.error("访问url地址：" + urlPath + "发生异常", e);
//        } finally {
//            if (httpurlconnection != null) {
//                httpurlconnection.disconnect();
//            }
//        }
//        return result;
//    }
//
//    /***
//     * 向指定URL发送POST方法的请求
//     *
//     * @param apiUrl
//     * @param data
//     * @param encoding
//     * @return
//     * @throws Exception
//     */
//    public static String sendPOST(String apiUrl, String data, LinkedHashMap<String, String> headers,
//                                  String encoding) throws Exception {
//        // 获得响应内容
//        String http_RespContent = null;
//        HttpURLConnection httpURLConnection = null;
//        int http_StatusCode = 0;
//        String http_RespMessage = null;
//        try {
//            // 建立连接
//            URL url = new URL(apiUrl);
//            httpURLConnection = (HttpURLConnection) url.openConnection();
//            // 需要输出
//            httpURLConnection.setDoOutput(true);
//            // 需要输入
//            httpURLConnection.setDoInput(true);
//            // 不允许缓存
//            httpURLConnection.setUseCaches(false);
//            // HTTP请求方式
//            httpURLConnection.setRequestMethod("POST");
//            // 设置Headers
//            if (null != headers) {
//                for (String key : headers.keySet()) {
//                    httpURLConnection.setRequestProperty(key, headers.get(key));
//                }
//            }
//            // 连接会话
//            httpURLConnection.connect();
//            // 建立输入流，向指向的URL传入参数
//            DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
//            // 设置请求参数
//            dos.write(data.getBytes(encoding));
//            dos.flush();
//            dos.close();
//            // 获得响应状态(HTTP状态码)
//            http_StatusCode = httpURLConnection.getResponseCode();
//            // 获得响应消息(HTTP状态码描述)
//            http_RespMessage = httpURLConnection.getResponseMessage();
//            // 获得响应内容
//            if (HttpURLConnection.HTTP_OK == http_StatusCode) {
//                // 返回响应结果
//                http_RespContent = getResponseContent(httpURLConnection);
//            } else {
//                // 返回非200状态时响应结果
//                http_RespContent = getErrorResponseContent(httpURLConnection);
//                String msg =
//                        MessageFormat.format("请求失败: Http状态码 = {0} , {1}", http_StatusCode, http_RespMessage);
//                LOG.info(msg);
//            }
//        } catch (UnknownHostException e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (MalformedURLException e) {
//            String message = MessageFormat.format("格式错误的URL: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (IOException e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } catch (Exception e) {
//            String message = MessageFormat.format("网络请求时发生异常: {0}", e.getMessage());
//            Exception ex = new Exception(message);
//            ex.initCause(e);
//            throw ex;
//        } finally {
//            if (null != httpURLConnection) {
//                httpURLConnection.disconnect();
//            }
//        }
//        return http_RespContent;
//    }
//
//
//    /***
//     * 读取HttpResponse响应内容
//     *
//     * @param httpURLConnection
//     * @return
//     * @throws UnsupportedEncodingException
//     * @throws IOException
//     */
//    private static String getResponseContent(HttpURLConnection httpURLConnection)
//            throws UnsupportedEncodingException, IOException {
//        StringBuffer contentBuffer = null;
//        BufferedReader responseReader = null;
//        try {
//            contentBuffer = new StringBuffer();
//            String readLine = null;
//            responseReader =
//                    new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
//            while ((readLine = responseReader.readLine()) != null) {
//                contentBuffer.append(readLine);
//            }
//        } finally {
//            if (null != responseReader) {
//                responseReader.close();
//            }
//        }
//        return contentBuffer.toString();
//    }
//
//    /***
//     * 读取HttpResponse响应内容
//     *
//     * @param httpURLConnection
//     * @return
//     * @throws UnsupportedEncodingException
//     * @throws IOException
//     */
//    private static String getErrorResponseContent(HttpURLConnection httpURLConnection)
//            throws UnsupportedEncodingException, IOException {
//        StringBuffer contentBuffer = null;
//        BufferedReader responseReader = null;
//        try {
//            contentBuffer = new StringBuffer();
//            String readLine = null;
//            responseReader =
//                    new BufferedReader(new InputStreamReader(httpURLConnection.getErrorStream(), "UTF-8"));
//            while ((readLine = responseReader.readLine()) != null) {
//                contentBuffer.append(readLine);
//            }
//        } finally {
//            if (null != responseReader) {
//                responseReader.close();
//            }
//        }
//        return contentBuffer.toString();
//    }
//
//
//    /**
//     * @return
//     * @description 获取HttpClient
//     * @author 宫清
//     * @date 2019年7月11日 上午1:08:25
//     */
//    private static CloseableHttpClient getHttpClient() {
//        return HttpClients.custom()
//                .setConnectionManager(connMgr)
//                .setRetryHandler(retryHandler)
//                .build();
//    }
//
//    /**
//     * @return
//     * @description 连接池配置
//     * @author 宫清
//     * @date 2019年7月11日 上午12:51:20
//     */
//    private static void cfgPoolMgr() {
//        ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
//        LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
//
//        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
//                .register("http", plainsf)
//                .register("https", sslsf)
//                .build();
//
//        //连接池管理器
//        connMgr = new PoolingHttpClientConnectionManager(registry);
//        //最大连接数
//        connMgr.setMaxTotal(MAX_TOTAL);
//        //每个路由基础的连接数
//        connMgr.setDefaultMaxPerRoute(ROUTE_MAX_TOTAL);
//    }
//
//
//    /**
//     * @description 设置重试机制
//     * @author 宫清
//     * @date 2019年7月11日 上午1:06:24
//     */
//    private static void cfgRetryHandler() {
//        retryHandler = new HttpRequestRetryHandler() {
//
//            @Override
//            public boolean retryRequest(IOException e, int excCount, HttpContext ctx) {
//                //超过最大重试次数，就放弃
//                if (excCount > MAX_RETRY) {
//                    return false;
//                }
//                //服务器丢掉了链接，就重试
//                if (e instanceof NoHttpResponseException) {
//                    return true;
//                }
//                //不重试SSL握手异常
//                if (e instanceof SSLHandshakeException) {
//                    return false;
//                }
//                //中断
//                if (e instanceof InterruptedIOException) {
//                    return false;
//                }
//                //目标服务器不可达
//                if (e instanceof UnknownHostException) {
//                    return false;
//                }
//                //连接超时
//                if (e instanceof ConnectTimeoutException) {
//                    return false;
//                }
//                //SSL异常
//                if (e instanceof SSLException) {
//                    return false;
//                }
//
//                HttpClientContext clientCtx = HttpClientContext.adapt(ctx);
//                HttpRequest req = clientCtx.getRequest();
//                //如果是幂等请求，就再次尝试
//                if (!(req instanceof HttpEntityEnclosingRequest)) {
//                    return true;
//                }
//
//                return false;
//            }
//        };
//    }
//
//}